package geradores;

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import util.ArquivoUtil;

public class GeradorCodigoObjetoMain {

	private PrintWriter arquivoSaidaMain;

	private static String nomeArquivoSaida = "Main";

	private static String caminhoArquivo = "c:\\gerador\\saida\\";

	/**
	 * Construtor Padrão
	 */
	public GeradorCodigoObjetoMain() {
		try {
			this.arquivoSaidaMain = ArquivoUtil.criarArquivo(caminhoArquivo, nomeArquivoSaida + ".java");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Método para gerar a Classe Token
	 */
	public void gerar() {

		// IMPORTS
		ArquivoUtil.escreverArquivo("import java.io.BufferedReader;\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("import java.io.FileReader;\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("import java.io.IOException;\n", arquivoSaidaMain);		

		ArquivoUtil.escreverArquivo("public class " + nomeArquivoSaida + "{\n", arquivoSaidaMain);

		ArquivoUtil.escreverArquivo("public static void main(String[] args) throws IOException {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("lerArquivo(\"c:/gerador/entrada/arquivoFonte.programa\");\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaMain);

		ArquivoUtil.escreverArquivo("private static void lerArquivo(String caminho) throws IOException {\n",
				arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("BufferedReader in = null;\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("try {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("in = new BufferedReader(new FileReader(caminho));\n", arquivoSaidaMain);

		ArquivoUtil.escreverArquivo("} catch (IOException e) {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("System.out.println(\"Erro na leitura do Arquivo.\");\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("System.exit(0);\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaMain);

		ArquivoUtil.escreverArquivo("AnalisadorLexico analisadorLexico = new AnalisadorLexico(in);", arquivoSaidaMain);

		ArquivoUtil.escreverArquivo("if (analisadorLexico.analisar()) {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("System.out.println(\"Sucesso ! Lexico\");\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("//analisadorLexico.mostrarToken();\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("} else {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("analisadorLexico.mostrarErros();\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("System.exit(0);\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaMain);

		ArquivoUtil.escreverArquivo(
				"AnalisadorSintatico analisadorSintatico = new AnalisadorSintatico(analisadorLexico.getTokens());\n",
				arquivoSaidaMain);

		ArquivoUtil.escreverArquivo("if (analisadorSintatico.analisar()) {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("System.out.println(\"Sucesso ! Sintatico\");\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("} else {\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("analisadorSintatico.mostraErros();\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("System.exit(0);\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaMain);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaMain);

		fechaArquivo();

	}

	/**
	 * Método para fechar o arquivo
	 */
	private void fechaArquivo() {
		ArquivoUtil.fecharArquivo(arquivoSaidaMain);
	}

}
